package pe.gob.osce.sirenas.svc;

import java.io.File;
import java.io.UnsupportedEncodingException;
import java.util.Date;
import java.util.List;
import java.util.Properties;
import java.util.ResourceBundle;

import javax.activation.DataHandler;
import javax.activation.FileDataSource;
import javax.ejb.EJB;
import javax.ejb.Stateless;
import javax.mail.Authenticator;
import javax.mail.BodyPart;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.Multipart;
import javax.mail.PasswordAuthentication;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMultipart;

import org.apache.log4j.Logger;

import pe.gob.osce.sirenas.dao.NotificacionesDAOLocal;
import pe.gob.osce.sirenas.dao.convert.AuditoriaConvert;
import pe.gob.osce.sirenas.dao.convert.NotificacionesConvert;
import pe.gob.osce.sirenas.model.AuditoriaDTO;
import pe.gob.osce.sirenas.model.NotificacionesDTO;
import pe.gob.osce.sirenas.model.jpa.Auditoria;
import pe.gob.osce.sirenas.model.jpa.Notificaciones;
import pe.gob.osce.sirenas.util.ConstanteEJB;

/**
 * Session Bean implementation class RegistrarFichaArbitroService
 */
@Stateless(mappedName = "RegistrarNotificacionService")
public class RegistrarNotificacionServiceImpl implements RegistrarNotificacionServiceLocal {
	final static Logger log = Logger.getLogger(RegistrarNotificacionServiceImpl.class);

	@EJB
	NotificacionesDAOLocal notificacionesDAOLocal;
	
	private ResourceBundle propSirenas = ResourceBundle.getBundle(ConstanteEJB.PROPERTIES);
	
	 /**
    Outgoing Mail (SMTP) Server
    requires TLS or SSL: smtp.gmail.com (use authentication)
    Use Authentication: Yes
    Port for TLS/STARTTLS: 587
  */
	public Session obtenerSesionServidorCorreo() {
		final String fromEmail =propSirenas.getString(ConstanteEJB.EMAIL_CUENTA); //requires valid gmail id
		final String password =propSirenas.getString(ConstanteEJB.EMAIL_PASS); // correct password for gmail id
		  
		System.out.println("TLSEmail Start");
		Properties props = new Properties();
		props.put("mail.smtp.host", "smtp.gmail.com"); //SMTP Host
		props.put("mail.smtp.port", "587"); //TLS Port
		props.put("mail.smtp.auth", "true"); //enable authentication
		props.put("mail.smtp.starttls.enable", "true"); //enable STARTTLS
		 
		        //create Authenticator object to pass in Session.getInstance argument
		Authenticator auth = new Authenticator() {
			//override the getPasswordAuthentication method
			protected PasswordAuthentication getPasswordAuthentication() {
			     return new PasswordAuthentication(fromEmail, password);
			}
		};
		Session session = Session.getInstance(props, auth);
		  
		//sendEmail(session, toEmail,"TLSEmail Testing Subject", "TLSEmail Testing Body");
		return session;
	}	
	
	public NotificacionesDTO registrarNotificacion(NotificacionesDTO notificacionesDTO,AuditoriaDTO auditoriaDTO)throws Exception {
		try {
			Notificaciones notificacionesJPA=null;
			
			notificacionesJPA=NotificacionesConvert.createJPA(notificacionesDTO, AuditoriaConvert.createJPA(auditoriaDTO));
			notificacionesJPA=notificacionesDAOLocal.insertNotificacion(notificacionesJPA);
			notificacionesDTO=NotificacionesConvert.createDTO(notificacionesJPA);
		} catch (Exception e) {
			e.printStackTrace();
		}
		return notificacionesDTO;
	}
	

	/**
	 * Utility method to send email with attachment
	 * @param session
	 * @param toEmail
	 * @param subject
	 * @param body
	 */
	//	sendAttachmentEmail( toEmail, "TLSEmail Testing With PDF", "TLSEmail Testing Body With PDF","D:\\temporal\\fichas\\2015-76.pdf");
	public void enviarCorreoNotificacionArchivoAdjunto(String toEmail, String subject, String body,String rutaArchivo){
		try{
			MimeMessage msg = new MimeMessage(obtenerSesionServidorCorreo());
			msg.addHeader("Content-type", "text/HTML; charset=UTF-8");
			msg.addHeader("format", "flowed");
			msg.addHeader("Content-Transfer-Encoding", "8bit");
			   
			msg.setFrom(new InternetAddress(propSirenas.getString(ConstanteEJB.EMAIL_CUENTA), propSirenas.getString(ConstanteEJB.EMAIL_ALIAS)));
			 
			msg.setReplyTo(InternetAddress.parse(propSirenas.getString(ConstanteEJB.EMAIL_CUENTA), false));
			 
			msg.setSubject(subject, "UTF-8");
			 
			msg.setSentDate(new Date());
			 /**fichaArbitralDTO debo obtener el Array de Correo de la Tabla Comunicaciones ->> toEmail*/ 
			msg.setRecipients(Message.RecipientType.TO, InternetAddress.parse(toEmail, false));
			           
			// Create the message body part
			BodyPart messageBodyPart = new MimeBodyPart();
			 
			// Fill the message
			messageBodyPart.setText(body);
			  
			 // Create a multipart message for attachment
			Multipart multipart = new MimeMultipart();
			 
			// Set text message part
			multipart.addBodyPart(messageBodyPart);
			 
			// Second part is attachment
			messageBodyPart = new MimeBodyPart();
		    File pdfFile=new File(rutaArchivo);
		    FileDataSource fds=new FileDataSource(pdfFile);
		    DataHandler pdfHandler=new DataHandler(fds);
		    
			messageBodyPart.setDataHandler(pdfHandler);
			messageBodyPart.setFileName("comunicado.pdf");
			multipart.addBodyPart(messageBodyPart);
			 
			// Send the complete message parts
			msg.setContent(multipart);
			 
			// Send message
			Transport.send(msg);
			System.out.println("EMail Sent Successfully with attachment!!");
		}catch (MessagingException e) {
			e.printStackTrace();
		} catch (UnsupportedEncodingException e) {
			e.printStackTrace();
		}
	}
	/**
     * Utility method to send simple HTML email
     * @param session
     * @param toEmail
     * @param subject
     * @param body
     */
	public void enviarCorreoNotificacion(String toEmail, String subject, String body){
		try{
			MimeMessage msg = new MimeMessage(obtenerSesionServidorCorreo());
			//set message headers
			msg.addHeader("Content-type", "text/HTML; charset=UTF-8");
			msg.addHeader("format", "flowed");
			msg.addHeader("Content-Transfer-Encoding", "8bit");
			
			msg.setFrom(new InternetAddress(propSirenas.getString(ConstanteEJB.EMAIL_CUENTA), propSirenas.getString(ConstanteEJB.EMAIL_ALIAS)));			
			msg.setReplyTo(InternetAddress.parse(propSirenas.getString(ConstanteEJB.EMAIL_CUENTA), false));			 
			msg.setSubject(subject, "UTF-8");			 
			msg.setText(body, "UTF-8");			 
			msg.setSentDate(new Date());
			
			 /**fichaArbitralDTO debo obtener el Array de Correo de la Tabla Comunicaciones ==> toEmail*/
			msg.setRecipients(Message.RecipientType.TO, InternetAddress.parse(toEmail, false));
			//msg.setRecipients(Message.RecipientType.TO, InternetAddress.parse(toEmail, false));
			Transport.send(msg);  
			 
			System.out.println("EMail Sent Successfully!!");
		}
		catch (Exception e) {
			e.printStackTrace();
		}
	}
	
	
	public List<NotificacionesDTO> consultarNotificacion(Long idFicha )throws Exception {
		List<NotificacionesDTO> listNotificacionesDTO=null;
		List<Notificaciones> listNotificacionesJPA=null;
		try {			
			
			listNotificacionesJPA=notificacionesDAOLocal.consultarNotificaciones(idFicha);
			
			listNotificacionesDTO=NotificacionesConvert.createListNotificacionDTO(listNotificacionesJPA);
			
		
		} catch (Exception e) {
			e.printStackTrace();
		}
		return listNotificacionesDTO;
	}
	
	@Override
	public NotificacionesDTO actualizarNotificacion(NotificacionesDTO notificacionesDTO, AuditoriaDTO auditoriaDTO)throws Exception {
		NotificacionesDTO objetoDTO=null;
		Notificaciones notificacionesJPA=null;
		Auditoria auditoriaJPA=null;
		try {			
			auditoriaJPA=AuditoriaConvert.createJPA(auditoriaDTO);
			
			notificacionesJPA=NotificacionesConvert.createJPA(notificacionesDTO, auditoriaJPA);
			
			notificacionesJPA=notificacionesDAOLocal.actualizarNotificacion(notificacionesJPA, auditoriaJPA);
			
			objetoDTO=NotificacionesConvert.createDTO(notificacionesJPA);
			
		
		} catch (Exception e) {
			e.printStackTrace();
		}
		return objetoDTO;
	}

	
}
